#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_pwm.h"

/*AT命令
"//vendor\hisi\hi3861\hi3861\components\at\src",
*/
#include <at.h>
#include <hi_at.h>

/*
2020年11月8日 
作者:hcl0317
链接：
实现功能：
使用红绿灯扩展板，按一下按键，点亮一个灯，按键按下时，蜂鸣器发声，按键抬起，蜂鸣器停止
主要功能点:
1. GPIO 输出 -> LED灯
2. GPIO 输入 中断 -> 按键
3. PWM功能 -> 蜂鸣器
*/

//红黄绿灯扩展板上，对应的GPIO10,11,12，高电平点灯，低电平灭灯
static WifiIotIoName LightGPIO[] = 
{
    WIFI_IOT_IO_NAME_GPIO_10,//红灯
    WIFI_IOT_IO_NAME_GPIO_12,//黄灯
    WIFI_IOT_IO_NAME_GPIO_11//绿灯
};


//红黄绿灯扩展板上的按键
static int volatile BtnPressed = 0;//1表示按下，0表示抬起
static int volatile BtnPressed_idx = 0;//
static void OnButtonPressed_isr(char* arg);//按键按下中断处理函数
static void OnButtonReleased_isr(char* arg);//按键抬起中断处理函数


static void OnButtonPressed_isr(char* arg)
{
    (void)arg;

    printf("[HelloWorld] OnButtonPressed()\n");

    BtnPressed = 1;
    BtnPressed_idx++;
    BtnPressed_idx %= 4;

    GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,
                        WIFI_IOT_INT_TYPE_EDGE, 
                        WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,
                        OnButtonReleased_isr, NULL);
                        
}

static void OnButtonReleased_isr(char* arg)
{
    (void)arg;

    printf("[HelloWorld] OnButtonReleased()\n");

    BtnPressed = 0;

    GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,
                        WIFI_IOT_INT_TYPE_EDGE, 
                        WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,
                        OnButtonPressed_isr, NULL);
}


//1.任务处理函数
static void* HelloWorld_Task(const char* arg)
{
    int i = 0;
    (void)arg;
    printf("[HelloWorld] HelloWorld_Task()\n");

    GpioInit();//使用GPIO，都需要调用该接口

    //红黄绿灯扩展板上，对应的LED GPIO10,11,12初始化
    printf("LED GPIO init...\r\n");
    for(i=0; i<3; i++)
    {
        //复用引脚为 GPIO
        IoSetFunc(LightGPIO[i], 0);
        //设置为输出
        GpioSetDir(LightGPIO[i], WIFI_IOT_GPIO_DIR_OUT);
    }

    //红黄绿灯扩展板上，对应的按键 GPIO8 初始化为GPIO，输入
    printf("KEY GPIO init...\r\n");
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);//GPIO
    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_GPIO_DIR_IN);//设置为输入
    IoSetPull(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_PULL_UP);
    GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,
                        WIFI_IOT_INT_TYPE_EDGE, 
                        WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,
                        OnButtonPressed_isr, NULL);

    //红黄绿灯扩展板上，对应的蜂鸣器 GPIO9 初始化为PWM功能
    printf("PWM GPIO init...\r\n");
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);//PWM
    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);//设置为输入
    PwmInit(WIFI_IOT_PWM_PORT_PWM0);

    while(1)
    {
        //logic code for task

        //按一次按键，顺序点亮一个灯      
        int j = 0;
        for(j = 0; j < 3; j++)
        {
            if(BtnPressed_idx == j)
            {
                GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE1);//高电平，点亮灯
            }
            else
            {
                 GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE0);//关闭灯
            }
        }

#if 0
        //流水灯点亮
        for(j = 0; j< 3; j++)
        {
             GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE0);//关闭所有灯
        }

        i = (i + 1) % 3;
        GpioSetOutputVal(LightGPIO[i], WIFI_IOT_GPIO_VALUE1);//高电平，点亮灯
        sleep(1);//延时1秒
#endif

        //按键触发的处理
        if(BtnPressed)
        {
            PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 40 * 1000);//按键按下，蜂鸣器发声
        }else{
            PwmStop(WIFI_IOT_PWM_PORT_PWM0);//按键抬起，蜂鸣器停止
        }

        //usleep(500000);
        usleep(100000);
    }
 
    return NULL;
}

/*AT命令*/
/*AT命令 hello*/
hi_u32 at_exe_hello_cmd(hi_s32 argc, const hi_char *argv[])
{
    argc=argc;
    argv=argv;
    hi_at_printf("at_exe_hello_cmd, hello World\r\n");
    return HI_ERR_SUCCESS;
}

const at_cmd_func g_at_edp_func_tbl[] = {
    {"+HELLO", 6, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_exe_hello_cmd},
};


//2.任务入口函数
static void HelloWorld_Entry(void)
{
    osThreadAttr_t attr = {0};

    printf("[HelloWorld] HelloWorld_Entry()\n");

    attr.name = "HelloWorld_Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;//堆栈大小
    attr.priority = osPriorityNormal;//优先级

    hi_at_register_cmd(g_at_edp_func_tbl, sizeof(g_at_edp_func_tbl)/sizeof(g_at_edp_func_tbl[0]));

    if (osThreadNew((osThreadFunc_t)HelloWorld_Task, NULL, &attr) == NULL)
    {
        printf("[HelloWorld] Falied to create LedTask!\n");
    }
}



//3.注册模块
SYS_RUN(HelloWorld_Entry);